108ebf97e067ccec1abc2023816a921e5b80b473,src/com/redhat/ceylon/compiler/java/codegen/ExpressionTransformer.java,ExpressionTransformer,transformComprehension,#Comprehension#,1683

Before Change


                    if (reassign) {
                        otherCondition = makeLetExpr(_varName, List.<JCStatement>nil(), make().Type(syms().objectType), _expr, test);
                    } else {
                        otherCondition = make().Unary(JCTree.NOT, makeLetExpr(_varName, List.<JCStatement>nil(), make().Type(syms().objectType), _expr, test));
                    }
                } else if (cond instanceof ExistsCondition) {
                    JCExpression expression = transformExpression(var.getSpecifierExpression().getExpression());
                    otherCondition =  make().Binary(reassign ? JCTree.NE : JCTree.EQ, expression, makeNull());
                } else if (cond instanceof NonemptyCondition) {
                    JCExpression expression = transformExpression(var.getSpecifierExpression().getExpression());
                    String varName = tempName();
                    JCExpression test = makeNonEmptyTest(null, varName);
                    if (reassign) {
                        otherCondition = makeLetExpr(varName, List.<JCStatement>nil(), make().Type(syms().objectType), expression, test);
                    } else {
                        otherCondition = make().Unary(JCTree.NOT, makeLetExpr(varName, List.<JCStatement>nil(), make().Type(syms().objectType), expression, test));
                    }
                } else if (cond instanceof BooleanCondition) {
                    otherCondition = make().Unary(JCTree.NOT, transformExpression(((BooleanCondition) cond).getExpression(),
                            BoxingStrategy.UNBOXED, typeFact().getBooleanDeclaration().getType()));
                } else {
                    return makeErroneous(cond, "This type of condition is not supported yet for comprehensions");
                }
                condExpr = make().Binary(JCTree.AND, condExpr, otherCondition);
                //Create the context method that filters from the last iterator
                ctxtName = "next"+idx;
                fields.add(make().MethodDef(make().Modifiers(2), names().fromString(ctxtName),
                    makeJavaType(typeFact().getBooleanDeclaration().getType()),
                    List.<JCTree.JCTypeParameter>nil(), List.<JCTree.JCVariableDecl>nil(),
                    List.<JCExpression>nil(), make().Block(0, List.<JCStatement>of(
                        make().WhileLoop(condExpr, make().Block(0, reassign ? List.<JCStatement>of(
                            //If there's a var, assign the last item to it
                            make().If(make().Unary(JCTree.NOT, makeUnquotedIdent(prevItemVar+"$exhausted")),
                                make().Exec(make().Assign(makeUnquotedIdent(var.getDeclarationModel().getName()),
                                    make().TypeCast(makeJavaType(var.getDeclarationModel().getType(), NO_PRIMITIVES), transformExpression(var.getSpecifierExpression().getExpression())
                                ))), null)
                        ) : List.<JCStatement>nil())),
                        make().Return(make().Unary(JCTree.NOT, makeUnquotedIdent(prevItemVar+"$exhausted")))
                )), null));
                clause = ((IfComprehensionClause)clause).getComprehensionClause();

After Change


                    makeJavaType(typeFact().getBooleanDeclaration().getType()),
                    List.<JCTree.JCTypeParameter>nil(), List.<JCTree.JCVariableDecl>nil(),
                    List.<JCExpression>nil(), make().Block(0, List.<JCStatement>of(
                        make().WhileLoop(condExpr, make().Block(0, List.<JCStatement>nil())),
                        make().Return(make().Unary(JCTree.NOT, makeUnquotedIdent(prevItemVar+"$exhausted")))
                )), null));
                clause = ((IfComprehensionClause)clause).getComprehensionClause();